import axios from 'axios';
import moment from 'moment';
import md5 from 'md5';
import { Toast } from 'teaset'
// import { NativeModules } from 'react-native';


// 创建axios实例
// var url = 'http://192.168.121.6:8080/exue-exueyun-api-web';
// var url = "http://192.168.121.6:8080/exue-exueyun-api-web";
var url = "http://192.168.125.100:8085/exue-exueyun-api-web"; // 测试服api 地址 请勿删除  打包换成这个地址
// var url = "http://eke.api.jzexueyun.com"; // 正式环境api 地址 FIXME: 注意修改 

// var url = "eke.api.jzexueyun.com/";

const service = axios.create({
    baseURL: url, // api的base_url
    timeout: 30000 // 请求超时时间 30000
});


// request拦截器
service.interceptors.request.use(config => {
    // Do something before request is sent
    function getRandom(n, m) {
        n = Number(n);    //强制转换成数字
        m = Number(m);
        if (isNaN(n) || isNaN(m)) {    //判断是否为有效数字 ，其中一个不是有效数字就返回[0,1)之间的随机小数
            return math.random();
        }
        if (n > m) {     //如果n>m则交换
            let temp = n;
            n = m;
            m = temp;
        }
        return Math.round(Math.random() * (m - n) + n);
    }
    function getSixNo() {
        let arr = [];
        for (let i = 0; i < 6; i++) {
            arr.push(getRandom(0, 9));
        }
        return arr.join('');
    }

    const servCode = 'elearning'
    const randNum = getSixNo(); //6位随机码
    const realTime = moment().format('YYYYMMDDHHmmss'); //流水号前面的时间 格式：yyyyMMddHHmmss
    const sendTime = moment().format('YYYY-MM-DD HH:mm:ss'); //消息发送时间，必填，格式为：yyyy-MM-dd HH:mm:ss
    let transId = realTime + randNum; //唯一消息流水号，必填，格式为：yyyyMMddHHmmss+6位随机码 隐藏规则:对于同一客户端类型且同一ip的同一个用户, 如果请求一直是一样的yyyyMMddHHmmss, 则认为是不合法的请求 
    /**
     * 例如:
     * SERVCODE: exueyunServ
     * TRANSID: 20180517125812ui234h
     * 则以"exueyunServ20180517125812ui234h"生成MD5码
    */
    let sysSign = servCode + transId;
    sysSign = md5(sysSign);
    let requestObj = {
        'ROOT': config.data,
        'ROUTE': {
            'SENDER': 'elearningWEB',
            'RECEIVE': servCode,
            'TIME': sendTime,
            'SERVCODE': servCode,
            'MSGTYPE': 'request',
            'TRANSID': transId,
            'VERSION': '1.0',
            'SYSSIGN': sysSign,
        }
    }
    requestObj.ROUTE.ACCESSTOKEN = global.ECourseConstant.userInfo.token;
    config.data = requestObj;

    global.log(config.data, '---------请求参数');

    return config;

}, error => {
    Promise.reject(error);
})

// respone拦截器
service.interceptors.response.use(
    response => {
        /**
         * 下面的注释为通过response自定义code来标示请求状态，当code返回如下情况为权限有问题，登出并返回到登录页
         * 如通过xmlhttprequest 状态码标识 逻辑可写在下面error中
         */

        global.log(response, "===response====");
        const result = response.data.RESULT;
        // global.log('code:' + result.RESULT_CODE);

        if (result.RESULT_CODE !== 200) {
            let msg = '参数错误！';
            switch (result.RESULT_CODE) {
                case 1100:
                    msg = ''; // 过于频繁，请稍后再试！
                    break;
                case -1:
                    msg = result.RESULT_DESC;
                    break;
                case 4001:
                    msg = '访问过期，重新跳转到登录页面！';
                    setTimeout(() => {
                        // store.dispatch('FedLogOut').then(() => {
                        //     location.reload(); // 为了重新实例化vue-router对象 避免bug
                        // });
                    }, 3000);
                    break;
                case 4002:
                    msg = '不合法的凭证！';
                    break; //token失效规则是，2小时不请求，就失效
                case 4004:
                    msg = '页面不存在！';
                    break;
                case 4005:
                    msg = '没有权限访问该页面！';
                    break;
                case 4011:
                    msg = '';
                    break;
                case 4015:
                    msg = '';
                    break;
                case 5050:
                    msg = '';
                    break;
                // 验证原始密码    
                case 4018:
                    msg = '';
                    break;
                default:
                    msg = result.RESULT_DESC;
            };
            if (msg) {
                if (msg.length > 100) {
                    msg = '网络错误，请稍后再试。';
                }
                Toast.message(msg)
            }
            global.log("reject");
            return Promise.reject(result);
        } else {
            global.log("resolve");
            return Promise.resolve(response.data.ROOT);
        }
    },
    error => {
        let ErrorMsg = error.message;
        if (error.code == 'ECONNABORTED') ErrorMsg = '请求超时，请稍后再试。';
        return Promise.reject(error);
    }
)

export default service;